// 12. 预处理器

/**
 * 1. 什么是预处理器
 *      预处理器是一些指令，指示编译器在实际编译之前所需完成的预处理。
 *      所有的预处理器指令都是以井号（#）开头，只有空格字符可以出现在预处理指令之前。预处理指令**不是 C++ 语句**，所以它们不会以分号（;）结尾。
 * 2. #define预处理
 *      语法：#define macro-name replacement-text 
 *      说明：#define 预处理指令用于创建符号常量，该符号常量通常称为宏。当这一行代码出现在一个文件中时，在该文件中后续出现的所有宏都将会在程序编译之前被替换为 replacement-text。
 *      其他：#undef 取消定义
 *
 * 3. 参数宏
 *      示例: #define MIN(a,b)(a < b ? a : b)
 * 4. 条件编译:
 *      语法：
 *          #if... #elif ... #endif
 *          #ifdef 、#ifndef、#if defined 、#if !defined
 * 5. 预处理运算符
 *      1. # 运算符
 *         说明:会把 replacement-text 令牌转换为用引号引起来的字符串
 *         示例：
              #define MK_STR(x) (#x)
              std::cout << MK_STR(HELLO C++) << std::endl; // "HELLO C++"
 *      2. ## 运算符
 *         说明:用于连接两个令牌。
           示例：
              #define CONCAT(x, y) (x##y)
              int xy = 100;
              std::cout << CONCAT(x, y) << std::endl; //100
 * 6. 预定义宏     
      宏	       描述
    __LINE__	  这会在程序编译时包含当前行号。
    __FILE__	  这会在程序编译时包含当前文件名。
    __DATE__	  这会包含一个形式为 month/day/year 的字符串，它表示把源文件转换为目标代码的日期。
    __TIME__	  这会包含一个形式为 hour:minute:second 的字符串，它表示程序被编译的时间。  
    
 * 扩展：
*/
#include <iostream>

#define __mark 21

#if 11 == __mark

/**
 * #11
*/

int main(void)
{
  
  printf("-----------end-------------\n");
  return 0;
}
#elif 21 == __mark

/**
 * #21
*/


int main(void)
{
  
  printf("-----------end-------------\n");
  return 0;
}
#endif